package com.zbb.online_exam.utils;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.zbb.online_exam.constant.Method;
import com.zbb.online_exam.dto.JsonResult;
import io.jsonwebtoken.ExpiredJwtException;
import org.springframework.stereotype.Component;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author zbbstart
 * @date 2021/2/8 - 21:04
 */
@Component
public class HttpUtils {

    /**
     * 构建失败情况下要返回给前端的JSON对应的对象
     *
     * @param errMsg 错误信息
     * @return 错误时的JSON对应的对象
     * @method 自定义的枚举请求方式类
     */
    public JsonResult buildFailure(String errMsg, Method method) {
        JsonResult jsonResult = new JsonResult();
        jsonResult.setSuccess(false);
        if (method.equals(Method.GET)) {
            jsonResult.setCode(404);
        } else {
            jsonResult.setCode(400);
        }
        jsonResult.setError(errMsg);
        return jsonResult;
    }

    /**
     * 构建成功情况下要返回给前端的JSON对应的对象
     *
     * @param data 要返回给前端的数据
     * @return 成功时的JSON对应的对象
     * @method 自定义的枚举请求方式类
     */
    public JsonResult buildSuccess(Method method, Object... data) {
        JsonResult jsonResult = new JsonResult();
        if (method.equals(Method.GET) || method.equals(Method.PUT) || method.equals(Method.PATCH)) {
            jsonResult.setCode(200);
        }
        if (method.equals(Method.POST)) {
            jsonResult.setCode(201);
        }
        if (method.equals(Method.DELETE)) {
            jsonResult.setCode(204);
        }
        jsonResult.setSuccess(true);
        if (null != data && data.length != 0) {
            jsonResult.setData(data[0]);
        }
        return jsonResult;
    }

    /**
     * 401错误代表用户没有访问权限，需要进行身份认证
     *
     * @param o     异常对象
     * @param error 错误信息
     * @return 成功时的JSON对应的对象
     */
    public JsonResult build401(Object o, String error) {
        JsonResult result = new JsonResult();
        result.setCode(401);
        if (o instanceof ExpiredJwtException) {
            result.setError("登录信息已过期");
        } else {
            result.setError(error);
        }
        return result;
    }

    /**
     * 403 拒绝fangwen
     * @return 成功时的JSON对应的对象
     */
    public JsonResult build403() {
        JsonResult result = new JsonResult();
        result.setCode(403);
        result.setError("权限不足");
        return result;
    }
    /**
     * 403 拒绝fangwen
     * @param error 错误信息
     * @return 成功时的JSON对应的对象
     */
    public JsonResult build403(String error) {
        JsonResult result = new JsonResult();
        result.setCode(403);
        result.setError(error);
        return result;
    }

    /**
     * 500服务器异常
     *
     * @return 成功时的JSON对应的对象
     */
    public JsonResult build500() {
        JsonResult jsonResult = new JsonResult();
        jsonResult.setSuccess(false);
        jsonResult.setCode(500);
        jsonResult.setError("服务器异常");
        return jsonResult;
    }

    private static void writeJson(HttpServletResponse res, Object data) {
        res.setContentType("application/json;charset=utf-8");
        try (PrintWriter out = res.getWriter();) {
            out.write(new ObjectMapper().writeValueAsString(data));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void writeJson(HttpServletResponse res, Object data, int code) {
        res.setStatus(code);
        writeJson(res, data);
    }

    /**
     * 写入Cookie
     *
     * @param name  名字
     * @param value 值
     * @param age   生存时间
     */
    public Cookie addCookie(String name, String value, int age) {
        Cookie cookie = new Cookie(name, value);
        cookie.setPath("/");
        cookie.setMaxAge(age);
        return cookie;
    }

    /**
     * 根据Cookie的名字获取Cookie的值
     *
     * @param name Cookie的名字
     * @return Cookie的值
     */
//    public String getCookie(String name) {
//        Cookie[] cookies = req.getCookies();
//        if (!ArrayUtils.isEmpty(cookies)) {
//            for (Cookie cookie : cookies) {
//                if (cookie.getName().equals(name)) {
//                    return cookie.getValue();
//                }
//            }
//        }
//        return null;
//    }


    /**
     * 删除Cookie
     *
     * @param name Cookie的名字
     */
    public void deleteCookie(String name) {
        addCookie(name, "", 0);
    }

}